const fs = require('fs').promises
// const fs = require('fs')

// 判断是不是 promise
// 可能不是 原生的 Promise
const isPromise = value => typeof value.then === 'function'
// Promise.all = function (promises) {
//     return new Promise((resolve, reject) => {
//         // 并发（使用for 循环迭代执行） 和 串行 （借助回调 第一个完成后调用第二个）
//         // 遍历 数组  依次拿到执行结果
//         let arr = []
//         let index = 0
//         const processData = (key, data) => {
//             arr[key] = data // 不能使用数组的长度来计算
//             if(++ index === promises.length) {
//                 resolve(arr)
//             }
//             // if(arr.length == promises.length) {
//             //     resolve(arr)
//             // }
//         }
//         for(let i = 0; i < promises.length; i ++) {
//             let result = promises[i]
//             if(isPromise(result)) {
//                 result.then((data) => {
//                     processData(i, data)
//                 }, reject)
//             } else {
//                 processData(i, result)
//             }
//         }
//     })
// }

// 默认无法中断 只是 不采用返回的结果 fetch api
// Promise.all([1, 2, fs.readFile('./node/name.txt', 'utf8'), fs.readFile('./node/age.txt', 'utf8')]).then(data => {
//     console.log(data)
// }) 

Promise.race = function (promises) {
    return new Promise((resolve, reject) => {
        for(let i = 0; i < promises.length; i ++) {
            let result = promises[i]
            if(!isPromise(result)) {
                result.then(resolve, reject)
            } else {
                resolve(result)
            }
        }
    })
}

// 谁跑的 快 用谁的
// Promise.race([fs.readFile('./node/name.txt', 'utf8'), fs.readFile('./node/age.txt', 'utf8')]).then(data => {
//     console.log(data)
// }) 

// 中断 promise 的功能 一个promise 正在走向成功 3000 之后成功， 超过2000 就认为是失败啦

let promise = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve('ok 成啦')
    }, 3000);
})

// promise.then(data => {
//     console.log(data)
// }, err => {
//     console.log('失败啦')
// })

const wrap = promise => {
    let abort
    let myP = new Promise((resolve, reject) => {
        abort = reject
    })
    let p = Promise.race([promise, myP])
    p.abort = abort
}

let p = wrap(promise)

p.then(data => {
    console.log(data)
}, err => {
    console.log(err)
})

setTimeout(() => {
    p.abort('promise 超时')
}, 2000);


// Promise.try 断掉 链

Promise.resolve(100).then().then(() => {
    return new Promise((resolve, reject) => {
        // 啥都不写 卡死, 不会内存泄漏 状态是 pending
    })
}).then(data => {
    console.log(data)
})